"""
@-*- coding: utf-8 -*-
@ python: 3.12.3
@ 创建者: JacksonCode
@ 创建时间: 2025/7/26
"""
import time
from queue import Queue
import threading


# 模拟任务类
class Task:

    def __init__(self, name):
        self.name = name

    def execute(self):
        """ 模拟耗时操作 """
        print(f"🚀{threading.current_thread().name} 开始执行{self.name}")
        time.sleep(2)
        print(f"✅{threading.current_thread().name} 执行成功{self.name}")


# 线程池工作者
class Worker(threading.Thread):

    def __init__(self, task_queue):
        super().__init__()
        self.task_queue = task_queue

    def run(self):
        while True:
            task = self.task_queue.get()  # 阻塞获取任务
            if task is None:
                self.task_queue.task_done()
                break
            try:
                task.execute()
            finally:
                self.task_queue.task_done()


def main():
    # 创建任务队列（最大容量10）
    task_queue = Queue(maxsize=10)

    # 创建并启动线程池（4个工作线程）
    threads = []
    for i in range(4):
        t = Worker(task_queue)
        t.start()
        threads.append(t)
        print(f"🧵 启动工作线程 {t.name}")

    # 提交20个任务
    for i in range(20):
        task_queue.put(Task(f"任务-{i + 1}"))
        print(f"📥 已提交任务-{i + 1}")

    # 等待所有任务完成
    task_queue.join()
    print("🔔 所有任务已完成！")

    # 优雅关闭线程
    for _ in range(len(threads)):
        task_queue.put(None)  # 发送终止信号
    for t in threads:
        t.join()


if __name__ == "__main__":
    start_time = time.time()
    main()
    print(f"⏱️ 总耗时: {time.time() - start_time:.2f}秒")
